package com.spzx.product.api;

import com.spzx.common.core.constant.SecurityConstants;
import com.spzx.common.core.constant.ServiceNameConstants;
import com.spzx.common.core.domain.R;
import com.spzx.product.api.domain.ProductSku;
import com.spzx.product.api.factory.RemoteProductFallbackFactory;
import com.spzx.product.api.vo.SkuPriceVo;
import com.spzx.product.api.vo.ProductSkuVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 声明一个Feign客户端，用于调用远程产品服务
 * 该接口定义了与产品服务进行交互的方法，以便在微服务架构中进行声明式的HTTP调用
 */
@FeignClient(contextId = "remoteProductService",
        value = ServiceNameConstants.PRODUCT_SERVICE,
        fallbackFactory = RemoteProductFallbackFactory.class)
public interface RemoteProductService {

    /**
     * 获取指定ID的产品SKU信息
     * 该方法通过GET请求调用远程服务的/productSku/getProductSku/{skuId}接口，获取产品SKU的详细信息
     * 使用RequestHeader传递请求来源信息，以满足服务端可能的需求
     *
     * @param skuId 产品SKU的唯一标识符，用于指定需要获取信息的产品SKU
     * @param source 请求来源标识，用于告诉服务端请求的发起者
     * @return 返回一个封装了产品SKU信息的响应对象，如果调用失败，将返回相应的错误信息
     */
    @GetMapping("/productSku/getProductSku/{skuId}")
    R<ProductSkuVo> getProductSku(
            @PathVariable("skuId") Long skuId,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);


    /**
     * 获取指定SKU的价格信息。
     *
     * @param skuId  SKU的唯一标识符，通过路径变量传递。
     * @param source 请求来源，通过请求头传递，用于安全验证和日志记录。
     * @return 包含SKU价格信息的响应对象R<SkuPriceVo>。
     */
    @GetMapping(value = "/productSku/getSkuPrice/{skuId}")
    R<SkuPriceVo> getSkuPrice(
            @PathVariable("skuId") Long skuId,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source
    );


    /**
     * 获取商品SKU的价格列表
     * 此接口根据提供的SKU ID列表获取对应的商品价格信息
     * 主要用于在商品展示或结算时，获取多个商品SKU的价格
     *
     * @param skuIdList 商品SKU ID列表，用于指定需要查询价格的商品SKU
     * @param source 请求来源，用于安全控制或日志记录
     * @return 返回一个响应对象，包含指定SKU ID对应的商品价格信息列表
     */
    @PostMapping(value = "/productSku/getSkuPriceList")
    R<List<SkuPriceVo>> getSkuPriceList(
            @RequestBody List<Long> skuIdList,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source
    );




}
